******************************** *D0 - TEMP STORAGE FOR INPUT COMMANDS *D1 - DELAY LOOP COUNTER *D2 - X FROM THE CURSOR COMMAND *D3 - Y FROM THE CURSOR COMMAND *D4 - SHIFT NUMBER *D5 - KEEPS TRACK OF CURSOR CONDITION * ($00XX = CURSOR OFF ) * ($FFXX = CURSOR ON ) * ($FF00 = LINE CURSOR ) * ($FFFF = BLINK CURSOR) *A0 - TEMP ADDRESS REGISTER *A1 - TEMP ADDRESS REGISTER *A5 - KEEPS TRACK OF START OF STRING *A6 - KEEPS TRACK OF END OF STRING *A7 - STACK POINTER ******************************** CALL MACRO *TRAP 14 MACRO MOVE.B #\1,D7 TRAP #14 ENDM MAIN EQU $1000 DATA EQU $3000 ORG DATA *SET VARIABLES TEXT DC.B 'LCD_CONTROL>' ERR DC.B 'Invalid Command ' INPUT DS.W 2 WTEXT DS.W 1 *********** MAIN *********** ORG MAIN LEA.L $7000,A7 MOVE.W #$FF00,D5 BSR RSET ******* DISPLAY PROMPT ******** PROMPT LEA.L TEXT,A5 LEA.L ERR,A6 CALL 243 *OUTPUT STRING WITHOUT CR/LF LEA.L INPUT,A5 LEA.L INPUT,A6 CALL 241 *READ IN USER INPUT CHECKR MOVE.L (A5),D0 ANDI.L #$DFDFDFDF,D0 *CONVERT TO UPPERCASE ******************************** ******* COMMAND TEST ******* CKRSET CMPI.L #'RSET',D0 BNE CKCPOS BSR RSET BRA PROMPT CKCPOS CMPI.L #'CPOS',D0 BNE CKSHFT BSR CPOS BRA PROMPT CKSHFT CMPI.L #'SHFT',D0 BNE CKBKSP BSR SHFT BRA PROMPT CKBKSP CMPI.L #'BKSP',D0 BNE CKWRIT BSR BKSP BRA PROMPT CKWRIT CMPI.L #'WRIT',D0 BNE CKCRSR BSR WRIT BRA PROMPT CKCRSR CMPI.L #'CRSR',D0 BNE CKDPOF BSR CRSR BRA PROMPT CKDPOF CMPI.L #'DPOF',D0 BNE CKDPON BSR DPOF BRA PROMPT CKDPON CMPI.L #'DPON',D0 BNE CKQUIT BSR DPON BRA PROMPT CKQUIT CMPI.L #'QUIT',D0 BNE ERROR BRA QUIT ******************************** ********** ERROR *********** ERROR LEA.L ERR,A5 LEA.L INPUT,A6 CALL 227 *DISPLAY ERROR MESSAGE BRA PROMPT ******************************** **** DELAY SUBROUTINE ****** DELAY MOVE.L #4000,D1 DLOOP SUBI.L #1,D1 BNE DLOOP *DELAY FOR 1MSEC RTS ******************************** ****** RESET COMMAND ******* RSET MOVE.W #$38,$70000 *SEND '8-BIT DATA' BSR DELAY *DELAY MOVE.W #$0E,$70000 *SEND 'DISPLAY/CURSOR ON - LINE CURSOR' BSR DELAY *DELAY MOVE.W #$06,$70000 *SEND 'INC ENTRY MODE - SHIFT DISPLAY BSR DELAY *DELAY MOVE.W #$01,$70000 *SEND 'CLEAR DISPLAY' BSR DELAY *DELAY RTS ******************************** ** CURSOR POSITION COMMAND *** CPOS MOVE.L #WTEXT,A0 MOVE.W (A0),D0 CMPI.B #'1',D0 BNE CPOS2 MOVE.L #1,D2 BRA GET_Y CPOS2 CMPI.B #'2',D0 BNE ERROR MOVE.L #2,D2 GET_Y BSR NUMGET CMPI.B #$FF,D0 BEQ ERROR MOVE.B D0,D3 GOT_Y CMPI.B #1,D2 BNE GOT_Y2 MOVE.B #-1,D4 ADD.B D3,D4 ORI.B #$80,D4 MOVE.B D4,$70001 *SEND 'CURSOR POS ROW 1' BSR DELAY *DELAY RTS GOT_Y2 MOVE.B #$3F,D4 ADD.B D3,D4 ORI.B #$80,D4 MOVE.B D4,$70001 *SEND 'CURSOR POS ROW 2' BSR DELAY *DELAY RTS ******************************** ****** SHIFT COMMAND ******* SHFT LEA WTEXT,A0 MOVE.W (A0),D0 ANDI.B #$DF,D0 CMPI.B #'R',D0 BEQ RIGHT CMPI.B #'L',D0 BEQ LEFT BRA ERROR RIGHT BSR NUMGET CMPI.B #$FF,D0 BEQ ERROR RIGHTLP SUBI.B #1,D0 BMI PROMPT MOVE.W #$1F,$70000 *SEND 'SHIFT DISPLAY RIGHT' BSR DELAY *DELAY BRA RIGHTLP LEFT BSR NUMGET CMPI.B #$FF,D0 BEQ ERROR LEFTLP SUBI.B #1,D0 BMI PROMPT MOVE.W #$18,$70000 *SEND 'SHIFT DISPLAY LEFT' BSR DELAY *DELAY BRA LEFTLP ******************************** **** BACKSPACE COMMAND ***** BKSP MOVE.W #$10,$70000 *SEND 'MOVE CURSOR LEFT' BSR DELAY *DELAY MOVE.W #$20,$70002 *SEND LCD CHAR BSR DELAY *DELAY MOVE.W #$10,$70000 *SEND 'MOVE CURSOR LEFT' BSR DELAY *DELAY BRA PROMPT ******************************** ****** WRITE COMMAND ******* WRIT LEA WTEXT,A0 MOVE.L A0,D0 MOVE.L A6,D4 SUB.L D0,D4 SUBI.L #1,D4 CMPI.L #0,D4 BLE WRITERR MOVE.W (A0)+,D0 MOVE.W D0,$70002 BSR DELAY SUBI.L #1,D4 WLOOP CMPI.B #0,D4 BEQ DONE CMPI.B #1,D4 BEQ ENDIT MOVE.W (A0),D0 ASR.L #8,D0 MOVE.W D0,$70002 BSR DELAY MOVE.W (A0)+,D0 MOVE.W D0,$70002 BSR DELAY SUBI.L #2,D4 BRA WLOOP ENDIT MOVE.W (A0),D0 ASR.L #8,D0 MOVE.W D0,$70002 BSR DELAY DONE BRA PROMPT WRITERR BRA ERROR ******************************** *** CURSOR CONTROL COMMAND *** CRSR MOVE.W WTEXT,D0 CMP.B #'B',D0 BEQ BLINK CMP.B #'b',D0 BEQ BLINK CMP.B #'L',D0 BEQ LINE CMP.B #'l',D0 BEQ LINE CMP.B #'X',D0 BEQ XCURS CMP.B #'x',D0 BEQ XCURS BRA ERROR BLINK MOVE.W #$0F,$70000 *SEND 'BLINK CURSOR' MOVE.W #$FFFF,D5 BSR DELAY *DELAY BRA PROMPT LINE MOVE.W #$0E,$70000 *SEND 'LINE CURSOR' MOVE.W #$FF00,D5 BSR DELAY *DELAY BRA PROMPT XCURS MOVE.W #$0C,$70000 *SEND 'CURSOR OFF' MOVE.W #$0000,D5 BSR DELAY *DELAY BRA PROMPT ******************************** ******* DISPLAY OFF ******** DPOF MOVE.W #$08,$70000 *SEND 'DISPLAY OFF' BSR DELAY *DELAY BRA PROMPT ******************************** ******** DISPLAY ON ******** DPON MOVE.W #$0C,$70000 *SEND 'DISPLAY ON - CURSOR OFF BSR DELAY *DELAY CMPI.W #$FF00,D5 BNE OTHER1 MOVE.W #$0E,$70000 *SEND 'LINE CURSOR' BSR DELAY *DELAY BRA PROMPT OTHER1 CMPI.W #$FFFF,D5 BNE OTHER2 MOVE.W #$0F,$70000 *SEND 'BLINK CURSOR' BSR DELAY *DELAY BRA PROMPT OTHER2 BRA PROMPT *NO CURSOR ******************************** ***** NUMGET SUBROUTINE ****** NUMGET CLR.L D0 *GET NUMBER LEA WTEXT,A0 ADDA.L #4,A0 CMPA.L A0,A6 BEQ ONENUM BRA TWONUM ONENUM LEA WTEXT,A0 *ONLY ONE NUMBER ADDA.L #3,A0 MOVE.B (A0),D0 BSR ISNUM CMPI.B #$FF,D0 BEQ ERROR2 RTS TWONUM LEA WTEXT,A0 *TWO NUMBER ADDA.L #3,A0 MOVE.B (A0),D0 BSR ISNUM CMPI.B #$FF,D0 BEQ ERROR2 CLR.L D1 NUMLOOP SUBI.B #1,D0 BMI LOOPEND ADDI.B #$A,D1 BRA NUMLOOP LOOPEND ADDA.L #1,A0 MOVE.B (A0),D0 BSR ISNUM ADD.L D1,D0 RTS ERROR2 MOVE.B #$FF,D0 RTS ******************************** ***** ISNUM SUBROUTINE ***** ISNUM CMPI.B #$30,D0 BMI NOTNUM *INVALID NUMBER CMPI.B #$3A,D0 BMI ENDNUM NOTNUM MOVE.W #$FF,D0 ENDNUM SUBI.B #$30,D0 RTS ******************************** QUIT CALL 228 *RETURN TO TUTOR PROMPT END